การเขียน Shell Script
จากบทความก่อนหน้านี้ที่เราพูดกันถึง Unix, Linux, Kernel, Shell รวมถึง Shell Script ว่าคืออะไรกันไปแล้ว และ การเขียน Shell Script หละ ทำอย่างไร
- Unix คืออะไร ยูนิกซ์ คือ ระบบปฏิบัติการสำหรับ server
- Linux คืออะไร ทำงานอย่างไร ลินุกซ์ เป็นระบบปฎิบัติการชนิดหนึ่ง
- Kernel คืออะไร Kernel คือ ส่วนกลางควบคุมการทำงานทุกอย่างบน OS
- Shell คืออะไร Unix Shell หรือ Linux Shell คือ โปรแกรมรับคำสั่งให้กับ Kernel
- Shell Script คืออะไร Shell script คือ ภาษา programming ที่ใช้บน unix linux
คร่าวๆก็คือระบบปฎิบัติการ Unix หรือ Linux จะมีส่วนที่เป็น Kernel สำหรับเชื่อมต่อระหว่างส่วนเที่เป็น Hardware ในการบริหารจัดการทรัพยากร โดยตัวผู้ใช้งานสามารถสั่งการหรือใช้งานผ่านทาง Shell รวมถึงสามารถนำเอาคำสั่งใน Shell มาสร้างเป็น ชุดคำสั่งหรือ Shell Script ได้ เพื่อหาสามารถทำงานได้สะดวกขึ้น ที่นี้เรามีดูวิธีการเขียน Shell script กันต่อครับ
ตัวอย่าง Shell มี่นิยมใช้เขียน Shell script
- Bournr shell (/bin/sh) เป็น shell ในยุคแรกๆ ที่มีใช้กันอย่างแพร่หลาย มีการกำหนดโครงสร้างภาษาคล้ายๆ กับภาษาอัลกอ (Algo) สามารถเขียน shell script ได้ และยังเป็น starndard shell ที่มีใน UNIX ทุกตัว และยังสามารถย้าย shell script ไปยัง UNIX ระบบอื่นโดยไม่ต้องแก้ไขอะไรได้อีกด้วย จะมี default prompt เป็นเครื่องหมาย “ $ ”
- C shell (/bin/csh) เป็น shell ที่พัฒนาขึ้นมาหลังจาก Bourne shell มีรูปแบบคำสั่งและไวยากรณ์เหมือนกับภาษา C มี function การทำงานหลายที่ดีและอย่างสะดวก อีกทั้งยังสามารถควบคุมการไหลของข้อมูลได้ดีกว่า Bourne shell และยังมีความสามารถในการเรียกใช้คำสั่งที่ใช้ไปแล้ว จะมี default prompt เป็นเครื่องหมาย “ % ”
- Korn shell (/bin/ksh) เป็น shell ที่พัฒนามาจาดต้นแบบของ Bourne shell และ C shell สามารถทำงานใน function ของ Bourne shell ได้ทุกอย่าง การเขียน shell script ทำได้ง่ายและรัดกุมขึ้น สามารถนำคำสั่งที่ใช้ไปแล้วกลับมา execute ไปใหม่ได้ ถือได้ว่า Korn shell เป็นการรวมเอาข้อดีของ Bourne shell และ C shell มาไว้ด้วยกัน แต่ไม่ได้มีใน UNIX ทุกตัว จะมี default prompt เป็นเครื่องหมาย “ $ ”
- Bournr again shell (/bin/bash หรือ /usr/local/bin/bash) เป็นการเอา Bournr shell นำกลับมาพัฒนาใหม่ สามารถทำงานแบบ line editing ได้ และยังได้เพิ่มประสิทธิภาพในการทำงานอีกหลายอย่าง bash shell นี้ไม่ใช่ standard UNIX shell แต่เป็น default shell ของ linux ในปัจจุบัน จะมี default prompt เป็นเครื่องหมาย “ $ ”
ขั้นตอนการเขียน Shell Script
- สร้าง file Shell script
- กำหนด interpreter หรือ shebang
- ใส่ชุดคำสั่ง command line
- กำหนดสิทธิ์ execute ให้กับ shell script
- การเรียกใช้งาน shell script (execute)
- การสร้างตัวแปรใน shell script (variable)
- การเรียกใช้งานตัวแปรใน shell script (variable)
- การใช้งานตัวแปร environment (environment variable)
- ตัวแปรแบบพิเศษ
- การ Comment
- ตัวแปรแถวลำดับ (array variable)
- รูปแบบเงื่อนไข (expression)
- เงื่อนไข if expression
- เงื่อนไข case switch
- การใช้ loop while
- การใช้ loop for
- การส่งค่า input argument
1. สร้าง file Shell script
Shell script เป็น file text ธรรมดาสามารถสร้างด้วย editor ชนิดไหนก็ได้ เช่น vi, nano, gedit, emacs เป็นต้น
$ vi hello.sh
2. กำหนด interpreter หรือ shebang
บรรทัดแรกของ shell script เราต้องกำหนด shebang เพื่อให้ program รู้ว่าควรใช้ interpreter ใดในการ load ข้อมูล file ซึ่งสัญลักษณ์ที่ใช้คือ #!<shell program>
- #!/bin/sh
- #!/bin/csh
- #!/bin/bash
- #!/bin/ksh
- #!/usr/bin/perl
- #!/usr/bin/env python
#!/bin/bash ~ ~
3. ใส่ชุดคำสั่ง command line
ส่วนนี้คือ code program ที่เราต้องการให้ shell script ทำงาน ซึ่งสามารถศึกษาชุดคำสั่ง Shell ของ Unix และ Linux ได้จากบทความนี้ รวมคำสั่ง Unix – Linux Command line พื้นฐานเบื้องต้น
ทำลองให้ shell script แสดงคำว่า “Hello World” ด้วยคำสั่ง echo และลอง save file
#!/bin/bash echo "Hello World" ~
4. กำหนดสิทธิ์ execute ให้กับ shell script
หลักจากเราสร้าง Shell script ขึ้นมาได้แล้ว ลองสังเกตุจะเห็นว่า file ที่ได้มีสิทธิ์ หรือ permission ของ user owner (-rw-rw-r–) เพียงแค่ write กับ read เท่านั้น ไม่สามารถ execute ได้ ซึ่งก็ไม่ต่างกับ text file ธรรมดา
$ ls -ltr test.sh -rw-rw-r-- 1 staff staff 32 May 13 15:28 test.sh
เราจึงต้องทำการเปลี่ยน permission ก่อนด้วยคำสั่ง chmod เพื่อให้เราสามารถ execute shell script ตัวนี้ได้
$ chmod 700 test.sh $ ls -ltr test.sh -rwx------ 1 staff staff 32 May 13 15:28 test.sh
ซึ่งเมื่อมีเครื่อง x แล้วนั้นหมายถึงเราสามารถ execute file นี้ได้แล้ว
5. การเรียกใช้งาน shell script (execute)
พิมพ์ fullpath ของ shell script หรือ ถ้าอยู่ใน directory ก็ใช้ ./<shell script> ลงที่ prompt ของ shell แล้ว enter จากนั้น program จะทำงานเป็นการ execute shell script ตั้งแต่บรรทัดแรกจนถึงบรรทัดสุดท้ายพร้อมกับแสดงผลลัพธ์ที่ได้ออกมาที่หน้าจอ screen จนจบและออกจาก program ให้เอง
$ ./test.sh Hello World
6. การสร้างตัวแปรใน shell script (variable)
เชลล์สคริปต์เหมือนกับโปรแกรมทั่วๆไปที่มีตัวแปรไว้เก็บค่าต่างๆ สำหรับใช้งาน ตัวแปรที่ใช้ในเชลล์นั้นไม่จำเป็นต้องประกาศชนิดตัวแปรเหมือนกับภาษา C สามารถตั้งค่าแล้วนำไปใช้ได้ทันที
variable=value
*** ระวังเรื่อง space เพราะสำหรับ shell script แล้ว space คือการแบ่ง argument เพราะฉะนั้นห้ามมี space หน้าและหลัง “=” ซึ่งถ้าหากต้องการให้ค่าในตัวแปรมี space ให้ใช้ single quote (‘) หรือ double quote (“) ประกาศไว้หน้าและหลังคำที่ต้องการ
#!/bin/bash var1=shell var2=script var3='shell script' var4="shell script'
7. การเรียกใช้งานตัวแปรใน shell script (variable)
เวลาที่จะต้องการแสดงค่าให้ใช้เครื่อง”$” นำหน้าตัวแปร
#!/bin/bash var1=shell var2=script var3='shell script' var4="shell script' var5='$var1 $var2' var6="$var1 $var2" echo $var1 echo $var2 echo $var3 echo $var4 echo $var5 echo $var6
ซึ่งเมื่อทำการรัน shell script จะเห็นความแต่ต่างระหว่างการใช้ single quote และ double quote คือ สิ่งที่พิมพ์ใน เครื่องหมาย Quote ( ‘ ) จะมีค่าตามสิ่งที่พิมพ์ ส่วนในเครื่องหมาย Double quote ( “ ) จะเป็นการอ้างอิงนำผลลัพธ์ที่ตัวแปรเก็บไว้หรือค่าที่ตัวแปรเก็บไว้มาใช้
$ ./test.sh shell script shell script shell script $var1 $var2 shell script
8. การใช้งานตัวแปร environment (environment variable)
ตัวแปรที่ใช้ในเชลล์จะมีสองชนิดด้วยกัน คือ
- ตัวแปรธรรมดา (variable)
- ตัวแปรสภาพแวดล้อม (environment variable)
ตัวแปรสภาพแวดล้อมนั้นคล้ายกับตัวแปรธรรมดาแต่แตกต่างตรงที่ เมื่อโปรแกรมรันในเชลล์นั้น จะสืบทอดตัวแปรสภาพแวดล้อมและค่าที่อยู่ในตัวแปรสภาพแวดล้อมไปด้วย เราสามารถสร้างตัวแปรธรรมดาให้เป็นตัวแปรสภาพแวดล้อมได้ โดยการใช้คำสั่ง export
#!/bin/bash echo $NAME ~
เนื่องจากตัวแปร NAME ยังไม่มีการกำหนดค่า และ ไม่ได้เป็น environment variable จึงมีค่าเป็น null แต่ถ้าเรามีการ export ประกาศให้ NAME เป็น environment variable และ assign ค่าให้แล้ว จะทำการสืบทอดต่อไปยัง shell script ด้วย
$ ./test.sh $ $ export NAME=saixiii $ ./test.sh saixiii
9. ตัวแปรแบบพิเศษ
เป็นตัวแปรที่ระบบ assign ค่าให้เอง ไม่ต้องประกาศค่าให้ ซึ่งส่วนใหญ่เป็นค่าที่เกี่ยวกับระบบ enviroment ของ shell script เอง ที่เราสามารถเอาไปใช้งานได้
$0 $1 $2 …. | ใช้สำหรับอ้างอิงชื่อ shell script และ Argument ของ shell script เรียกว่า position parameter |
$# | ใช้บอกจำนวน Argument ที่อยู่ใน shell script นั้นๆ |
$* | แทน Argument ของ script เรียงกันทั้งหมด |
$@ | คล้ายกับ $* แต่จะใช้ช่องว่างคั่นระหว่าง position parameter |
$? | ใช้แสดงสถานการณ์จบการทำงานครั้งสุดท้าย ถ้าสั่งได้ถูกต้องไม่มี error จะแสดงค่า 0 ออกมา แต่ถ้าผิดพลาดจะแสดงค่าที่ไม่ใช่ 0 ออกมา |
$! | ใช้แสดง process ID ของ shell ที่ทำงานอยู่ |
10. การ Comment
เครื่องหมาย “ # ” ใช้แสดงหมายเหตุ เขียนไว้ตรงไหนใน Shell Script ก็ได้ (บรรทัดแรกใช้สำหรับ shebang) ใช้สำหรับการเขียนบันทึกใน script โดย shell จะถือว่าข้อความที่อยู่หลังเครื่องหมาย “ # ” เป็นหมายเหตุไม่มีผลต่อตัวโปรแกรม
#!/bin/bash # Test Comment var=hello echo $var
$ ./test.sh hello
จะเห็นได้ว่าข้อความที่อยู่หลังเครื่องหมาย “ # “ ไม่มีผลใดๆทั้งสิ้นเมื่อรันโปรแกรม เมื่อรันโปรแกรม โปรแกรมจะไม่แสดงข้อความที่ comment นั้นออกมา
11. ตัวแปรแถวลำดับ (array variable)
ตัวแปร array นั้นจะมี index เป็นตัวเลขเริ่มตั้งแต่ 0 เหมือนกับตัวแปรในภาษา C หรือภาษาอื่นๆ แต่เวลาที่ต้องการเรียกใช้ตัวแปรต้องใช้เครื่องหมาย “{ }” ช่วยจับกลุ่มด้วย เพราะไม่เช่นนั้นค่าที่ออกมาจะออกมาเฉพาะค่าแรกเท่านั้น ดูได้จากตัวอย่าง
#!/bin/bash txt[0]="a" txt[1]="b" txt[2]="c" echo $txt[0] $txt[1] $txt[2] echo ${txt[0]} ${txt[1]} ${txt[2]}
$ ./test.sh a[0] a[1] a[2] a b c
12. รูปแบบเงื่อนไข (expression)
เปรียบเทียบจำนวนเต็ม
เงื่อนไข | ความหมาย |
int1 –eq int2 | เป็นจริงเมื่อ int1 เท่ากับ int2 |
int1 –ne int2 | เป็นจริงเมื่อ int1 ไม่เท่ากับ int2 |
int1 –gt int2 | เป็นจริงเมื่อ int1 มากกว่า int2 |
int1 –ge int2 | เป็นจริงเมื่อ int1 มากกว่า หรือ เท่ากับ int2 |
int1 –le int2 | เป็นจริงเมื่อ int1 น้อยกว่า int2 |
int1 –lt int2 | เป็นจริงเมื่อ int1 น้อยกว่า หรือ เท่ากับ int2 |
เปรียบเทียบ string
เงื่อนไข | ความหมาย |
str1 = str2 | เป็นจริงเมื่อ str1 เหมือนกับ str2 |
str1 != str2 | เป็นจริงเมื่อ str1 ไม่เหมือนกับ str2 |
Str | เป็นจริงเมื่อ str ไม่เป็นค่าว่าง |
-n str | เป็นจริงเมื่อ str มีความยาวมากกว่า 0 |
-z str | เป็นจริงเมื่อ str มีความยาวเป็น 0 |
ตรวจสอบ file
เงื่อนไข | ความหมาย |
-d filename | เป็นจริงเมื่อ filename เป็น directory |
-f filename | เป็นจริงเมื่อ filename เป็น file |
-r filename | เป็นจริงเมื่อ filename อ่านได้โดยโปรแกรม |
-w filename | เป็นจริงเมื่อ filename เขียนได้โดยโปรแกรม |
-x filename | เป็นจริงเมื่อ filename run ได้โดยโปรแกรม |
-s filename | เป็นจริงเมื่อ filename มีขนาดไม่เป็น 0 |
เงื่อนไขอื่นๆ
เงื่อนไข | ความหมาย |
!expr | เป็นจริงเมื่อ exp เป็นเท็จ |
exp1 –a exp2 | เป็นจริงเมื่อ exp1 และ exp2 เป็นจริง |
exp1 –o exp2 | เป็นจริงเมื่อ exp1 หรือ exp2 เป็นจริง |
13. เงื่อนไข if expression
if [ expression ] then commands elif [ expression ] then commands else commands fi
จากตัวอย่างต่อไปเป็นการเปรียบเทียบ ตัวแปร string
#!/bin/bash var1="cat" var2="cat" if [ $var1 = $var2 ] then echo "Yes, it is equal" else echo "No, it is not equal" fi
$ ./test.sh Yes, it is equal
ในตัวอย่างแสดงการเปรียบเทียบตัวอักษรของตัวแปร text1 กับ text2 ว่าเหมือนกันหรือไม่ ถ้าเหมือนกันให้แสดงข้อความว่า “ Yes, it is equal ” หรือถ้าต่างกันให้แสดงข้อความว่า “ No, it is not equal ” ทั้งนี้เงื่อนไข if จะมี หรือ ไม่มี elif กับ else ก็ได้
14. เงื่อนไข case switch
คำสั่ง case เป็นคำสั่งที่ใช้ในการเปรียบเทียบเช่นเดียวกับคำสั่ง if แต่มีรูปการทำงานที่ต่างกัน
case string in str1) commands;; str2) commands;; str3) commands;; *) commands;; esac
จากตัวอย่างใช้ switch มาเปรียบเทียบตัวแปร string
#!/bin/bash var1="cat" case $var1 in "ant") echo "It is an ant";; "bee") echo "It is an bee";; "cat") echo "It is an cat";; *) echo "I don't know";; esac
$ ./test.sh It is an cat
ในตัวอย่างแสดงการเปรียบเทียบตัวอักษรของตัวแปร text ว่าตรงกับ string ที่เป็นเงื่อนไขของ case หรือไม่ ถ้าเหมือนกันก็ให้แสดงข้อความที่ตั้งไว้ในเงื่อนไง
15. การใช้ loop while
คำสั่ง while เป็นคำสั่งที่ใช้ในการวนรอบการทำงานของโปรแกรม โปรแกรมจะวนรอบจนกว่าเงื่อนไขที่กำหนดไว้จะเป็นเท็จ
while [ expression ] do commands …………. done
ทำการสร้าง loop while ด้วยเงื่อนไขตัวเลข ที่มีการ incremental
#!/bin/bash num=1 while [ $num -le 10 ] do echo "Loop $num" ((num = $num+1)) done
$ ./test.sh Loop 1 Loop 2 Loop 3 Loop 4 Loop 5 Loop 6 Loop 7 Loop 8 Loop 9 Loop 10
ในตัวอย่างเป็นการแสดงข้อความ “ Loop ” 10 บรรทัด โดยให้ตัวแปร num มีค่าเป็น 1 ต่อจากนั้นก็เข้าสู่ loop while โดยมีเงื่อนไขว่า $num น้อยกว่าหรือเท่ากับ 10 loop while จะทำการแสดงข้อความ “ Loop ” โดยวนรอบการทำงานไปเรื่อยๆ และจะทำการเพิ่มค่า num ทีละ 1 ก่อนจะวนรอบใหม่ เมื่อโปรแกรมวน loop ครบตามเงื่อนไขแล้ว จะได้ผลลัพธ์เป็นการแสดงข้อความ “ Loop ” 10 บรรทัด
16. การใช้ loop for
คำสั่ง for เป็นคำสั่งที่มีการทำงานคล้ายคลึงกับ คำสั่ง while แต่จะต่างกันตรงที่การเขียนเงื่อนไขที่ใช้ในการวน loop
for var in list do commands …………. done
ทำการสร้าง loop for โดยการนับจำนวนตาม list in
#!/bin/bash for i in 1 2 3 4 5 do echo "Loop $i" done
$ ./test.sh Loop 1 Loop 2 Loop 3 Loop 4 Loop 5
ในตัวอย่างเป็นการแสดงข้อความ “Loop ” ตามด้วยตัวเลข ในเงื่อนไข for นั้น “ i ” จะรับค่าตัวแปรที่อยู่หลัง “ in “ เข้ามาเก็บไว้ในตัวเอง ซึ่งตั้งไว้เป็น “ 1 2 3 4 5 “ มาทีละตัว ( จะใช้ช่องว่างในการแบ่งว่ามีกี่ตัว หรือกี่ argumentในเงื่อนไข ) loop for จะทำการแสดงข้อความตามจำนวน argument ที่อยู่หลัง “ in ” ซึ่งในโปรแกรมกำหนดเป็น “ 1 2 3 4 5 “ ซึ่งมีอยู่ห้าตัว โดยถูกแบ่งด้วยช่องว่าง เมื่อรันโปรแกรมแล้วจะเห็นได้ว่า ข้อความ “ Loop ” ตามด้วยจำนวนตัวเลข ถูกแสดงออกมา 5 บรรทัด โดยที่ตัวเลขนั้นมาจากตัวแปร “ $i ” ที่อยู่ในบรรทัด echo “Loop ” $i นั่นเอง
Loop for สามารถเขียนได้อีกอย่างหนึ่งดังนี้ for ((i=1;i<5;i++)) do echo "Loop $i" done
17. การส่งค่า input argument
จากหัวข้อตัวแปรแบบพิเศษ เราสามารถนำเอาตัวแปรพวกนี้มาใช้แทนการรับค่า input argument ได้ เพื่อให้ shell script สามารถทำงานได้ตามสถานการณ์ที่เปลี่ยนแปลงไป
#!/bin/bash var1=$1 var2=$2 echo "$1 & $2"
$ ./test.sh a b a & b $ ./test.sh "a c d" b a c d & b
ผลลัพธ์จากตัวอย่างจะเห็นได้ว่า ค่า $1 แทนค่าได้เท่ากับ input argument แรก และ $2 แทนค่าได้เท่ากับ input argument ถัดไป ซึ่งแบ่งด้วย space และถ้าเราอยากให้ค่า space ติดเข้าไปกับตัวแปรด้วยให้ใช้ double quote ในการประกาศร่วมใน argument
Reference
- Unix คืออะไร ยูนิกซ์ คือ ระบบปฏิบัติการสำหรับ server
- Linux คืออะไร ทำงานอย่างไร ลินุกซ์ เป็นระบบปฎิบัติการชนิดหนึ่ง
- Kernel คืออะไร Kernel คือ ส่วนกลางควบคุมการทำงานทุกอย่างบน OS
- รวมคำสั่ง Unix – Linux Command line พื้นฐานเบื้องต้น
- Shell คืออะไร Unix Shell หรือ Linux Shell คือ โปรแกรมรับคำสั่งให้กับ Kernel
- Shell Script คืออะไร Shell script คือ ภาษา programming ที่ใช้บน unix linux
- การเขียน Shell Script เบื้องต้น หลักการทำงาน และ เงื่อนไขการใช้
Author: Suphakit Annoppornchai
Credit: https://saixiii.com
[…] […]
[…] […]
[…] […]